package com.leetcode.June;

import java.util.ArrayList;

/**
 * @Description: 二数相加
 * @Author: Mr.Fxy
 * @CreateTime: 2024-07-23 09:07
 */
public class TwoNumSum {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode current = dummyHead;
        int carry = 0;

        while (l1 != null || l2 != null || carry != 0) {
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x + y + carry;
            carry = sum / 10;
            current.next = new ListNode(sum % 10);
            current = current.next;
            l1 = l1 == null ? null : l1.next;
            l2 = l2 == null ? null : l2.next;

        }
        return dummyHead.next;
    }
/**
 * 初始化：创建一个虚拟头节点 dummyHead，以及一个指针 current 指向 dummyHead，和一个变量 carry 记录进位。
 * 循环：我们需要一个循环来遍历两个链表的节点。循环条件是只要 l1 或者 l2 还有节点，或者 carry 不为零，我们就继续循环。
 * 相加与进位：在每次循环中，我们获取 l1 和 l2 当前节点的值（如果没有节点，值默认为0），然后加上 carry，得到一个和 sum。carry 更新为 sum 除以10的商，sum 的个位数（sum % 10）将被保存为新节点的值。
 * 创建新节点：我们创建一个新的节点，其值为 sum % 10，并让 current 的 next 指向这个新节点，然后移动 current 指针到新节点。
 * 移动指针：如果 l1 或者 l2 还有节点，我们分别移动它们的指针到下一个节点。
 * 返回结果：当循环结束时，dummyHead.next 就是我们创建的整个链表，即相加的结果。
 * */

}
